package li.nibble.twittertido.model;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.logging.Level;
import java.util.logging.Logger;

import li.nibble.twittertido.R;
import android.content.Context;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteException;
import android.database.sqlite.SQLiteOpenHelper;
import android.util.Log;

public class Helper extends SQLiteOpenHelper {
	/** Nombre de la base de datos. */
	private static final String DATABASE_NAME = "twittertido";
	/** Versión de la base de datos. */
	private static final int DATABASE_VERSION = 1;
	/** Tag correspondiente a DBHelper para el Log. */
	private static String TAG = "Helper";
	private Context context;

	/**
	 * Constructor que inicializa los parámetros
	 * 
	 * @param context
	 */
	public Helper(Context context) {
		super(context, DATABASE_NAME, null, DATABASE_VERSION);
		this.context = context;
	}

	/**
	 * Se encarga de crear la base de datos en caso de que esta no exista. Lee
	 * el script "create" almacenado en la carpeta res/raw/ y ejecuta cada una
	 * de esas lineas en la base de datos. La invocación de este método es
	 * transparente para los desarrolladores
	 * 
	 * @param db
	 *            la base de datos instanciada por el constructor de la clase
	 *            padre
	 */
	public void onCreate(SQLiteDatabase db) {
		try {
			BufferedReader is = new BufferedReader(new InputStreamReader(
					context.getResources().openRawResource(R.raw.create)));
			String script = null;
			while ((script = is.readLine()) != null) {
				db.execSQL(script);
			}
		} catch (SQLiteException sqle) {
			Log.e(this.getClass().getName(), sqle.getLocalizedMessage());
		} catch (IOException ex) {
			Logger.getLogger(Helper.class.getName())
					.log(Level.SEVERE, null, ex);
		}
	}

	/**
	 * Se encarga de sobreescribir, modificar, o reinstalar la base de datos en
	 * caso de que se necesite realizar un upgrade en la aplicación. La
	 * invocación de este método es transparente para los desarrolladores
	 * 
	 * @param db
	 *            la base de datos a actualizar.
	 * @param oldVersion
	 *            número de versión antigua
	 * @param newVersion
	 *            nuevo número de version
	 */
	@Override
	public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
		Log.w(TAG, "Upgrading database from version " + oldVersion + " to "
				+ newVersion + ", which will destroy all old data");
		// db.execSQL("DROP TABLE IF EXISTS TODAS");
		onCreate(db);
	}
}
